home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / libq / IIn_ret.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-02-13  |  2.5 KB  |  143 lines

  1. # include    <ingres.h>
  2. # include    <symbol.h>
  3. # include    "IIglobals.h"
  4. # include    <sccs.h>
  5. # include    <errors.h>
  6.  
  7. SCCSID(@(#)IIn_ret.c    8.3    2/13/85)
  8.  
  9.  
  10.  
  11. /*
  12. **  IIn_ret -- get next domain in a retrieve
  13. **
  14. **    Gets the next domain in a retrieve from the data
  15. **    pipe. If an error occurred previously in the tuple,
  16. **    will not load the c-var with the value of the domain.
  17. **    Performs the conversion from the gotten type to
  18. **    the expected type.
  19. **
  20. **    Signals any errors and calls IIerror() accordingly.
  21. **
  22. **    Expects the type and length of the next data item in
  23. **    IIr_sym.
  24. **
  25. */
  26.  
  27.  
  28.  
  29.  
  30. IIn_ret(addr, type)
  31. char    *addr;
  32. int    type;
  33. {
  34.     char            temp[256], *IIitos();
  35.     char            *s;
  36.     register struct retsym    *ret;
  37.     register        length;
  38.  
  39.  
  40.  
  41.     if (IIerrflag && IIerrflag != 1001)
  42.         return;        /* error, no data will be coming, or
  43.                  * the rest of the query should be
  44.                  * skipped
  45.                  */
  46.  
  47.         ret = &IIr_sym;
  48.  
  49.     if ((ret->len & I1MASK) &&
  50.         IIpb_get(&IIpb, temp, ret->len & I1MASK) != (ret->len & I1MASK))
  51.         IIsyserr("IIn_ret: bad pb_get-1 %d", ret->len & I1MASK);
  52.  
  53.  
  54. #    ifdef xETR1
  55.     if (IIdebug)
  56.     {
  57.         printf("%s ent ", IIproc_name ? IIproc_name: "");
  58.         printf("IIn_ret : addr 0%o type %d length %d type %d IIerrflag %d\n",
  59.         addr, type, ret->len & I1MASK, ret->type, IIerrflag);
  60.     }
  61. #    endif
  62.  
  63.  
  64.     IIdomains++;
  65.     switch (type)
  66.     {
  67.  
  68.       case opSHORT:
  69.         type = INT;
  70.         length = 2;
  71.         break;
  72.  
  73.       case opLONG:
  74.         type = INT;
  75.         length = 4;
  76.         break;
  77.  
  78.       case opFLOAT:
  79.         type = FLOAT;
  80.         length = 4;
  81.         break;
  82.  
  83.       case opDOUBLE:
  84.         type = FLOAT;
  85.         length = 8;
  86.         break;
  87.  
  88.       case opSTRING:
  89.         type = CHAR;
  90.         length = 255;    /* with the current implementation the length is not known */
  91.         break;
  92.  
  93.       default:
  94.         IIsyserr("IIn_ret:bad type %d", type);
  95.     }
  96.  
  97.     switch (ret->type)
  98.     {
  99.  
  100.       case INT:
  101.       case FLOAT:
  102.         if (type == CHAR)
  103.         {
  104.             s = IIitos(IIdomains);
  105.             IIerrflag = NUMINTOCHAR;
  106.             IIerror(NUMINTOCHAR, 1, &s);
  107.             return (0);
  108.         }
  109.         if (IIconvert(temp, IIerrflag ? temp : addr,
  110.            ret->type, ret->len & I1MASK, type, length) < 0)
  111.         {
  112.                 s = IIitos(IIdomains);
  113.                 IIerrflag = NUMOVFLO;
  114.                 IIerror(NUMOVFLO, 1, &s);
  115.         }
  116.         break;
  117.  
  118.       case CHAR:
  119.         if (type != CHAR)
  120.         {
  121.             s = IIitos(IIdomains);
  122.             IIerrflag = CHARINTONUM;
  123.             IIerror(CHARINTONUM, 1, &s);
  124.             return (0);
  125.         }
  126.         if (!IIerrflag)
  127.         {
  128.             IIbmove(temp, addr, ret->len & I1MASK);
  129.  
  130.             /* null terminate string */
  131.             addr [ret->len & I1MASK] = '\0';    
  132.         }
  133.         break;
  134.  
  135.       default :
  136.         IIsyserr("IIn_ret bad gotten type %d",
  137.         ret->type);
  138.     }
  139.  
  140.     if (IIpb_get(&IIpb, ret, 2) != 2)
  141.         IIsyserr("IIn_ret : bad pb_get - 2");
  142. }
  143.